/**
 ******************************************************************************
 * @file           : bsp_ds18b20.h
 * @brief          : DS18B20 Driver Header File
 ******************************************************************************
 * @attention
 *
 * DS18B20数字温度传感器驱动头文件
 * 单总线协议，测量范围：-55°C~+125°C
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_DS18B20_H
#define __BSP_DS18B20_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "./Devices/DS18B20/bsp_ds18b20_config.h"

/* Exported types ------------------------------------------------------------*/

/**
 * @brief DS18B20错误码枚举
 */
typedef enum
{
    DS18B20_OK = 0,             /*!< 成功 */
    DS18B20_ERROR_NODEV,        /*!< 未检测到设备 */
    DS18B20_ERROR_TIMEOUT,      /*!< 超时错误 */
    DS18B20_ERROR_CRC,          /*!< CRC校验错误 */
    DS18B20_ERROR_PARAM         /*!< 参数错误 */
} DS18B20_Error_e;

/**
 * @brief DS18B20分辨率枚举
 */
typedef enum
{
    DS18B20_RES_9BIT = 0,       /*!< 9位分辨率（0.5°C） */
    DS18B20_RES_10BIT,          /*!< 10位分辨率（0.25°C） */
    DS18B20_RES_11BIT,          /*!< 11位分辨率（0.125°C） */
    DS18B20_RES_12BIT           /*!< 12位分辨率（0.0625°C） */
} DS18B20_Resolution_e;

/* Exported constants --------------------------------------------------------*/

/* DS18B20命令 */
#define DS18B20_CMD_SKIP_ROM        0xCC    /*!< 跳过ROM */
#define DS18B20_CMD_CONVERT_T       0x44    /*!< 启动温度转换 */
#define DS18B20_CMD_READ_SCRATCHPAD 0xBE    /*!< 读暂存器 */
#define DS18B20_CMD_WRITE_SCRATCHPAD 0x4E   /*!< 写暂存器 */
#define DS18B20_CMD_COPY_SCRATCHPAD 0x48    /*!< 复制暂存器 */

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/**
 * @brief       初始化DS18B20
 *
 * @retval      DS18B20_OK=成功, 其他=失败
 */
DS18B20_Error_e ds18b20_init(void);

/**
 * @brief       读取温度
 *
 * @param[out]  temperature: 温度值指针（°C）
 *
 * @retval      DS18B20_OK=成功, 其他=失败
 */
DS18B20_Error_e ds18b20_read_temperature(float *temperature);

/**
 * @brief       设置分辨率
 *
 * @param[in]   resolution: 分辨率
 *
 * @retval      DS18B20_OK=成功, 其他=失败
 */
DS18B20_Error_e ds18b20_set_resolution(DS18B20_Resolution_e resolution);

/**
 * @brief       获取分辨率
 *
 * @param[out]  resolution: 分辨率指针
 *
 * @retval      DS18B20_OK=成功, 其他=失败
 */
DS18B20_Error_e ds18b20_get_resolution(DS18B20_Resolution_e *resolution);

/**
 * @brief       读取ROM ID（64位唯一序列号）
 *
 * @param[out]  rom_id: ROM ID缓冲区（8字节）
 *
 * @retval      DS18B20_OK=成功, 其他=失败
 */
DS18B20_Error_e ds18b20_read_rom_id(uint8_t *rom_id);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_DS18B20_H */
